#coding:utf-8
import os
import argparse
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LAParams, LTTextBoxHorizontal
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed, PDFResourceManager, PDFPageInterpreter


def pdf_txt(pdfPath, txtPath):
    '''
        pdf文字提取
        pdfPath pdf文件的路径
        txtPath 文本要保存的路径
    '''
    fp = open(pdfPath, 'rb')  # 以二进制读模式打开
    # 用文件对象来创建一个pdf文档分析器
    praser = PDFParser(fp)
    # 创建一个PDF文档
    doc = PDFDocument()
    # 连接分析器 与文档对象
    praser.set_document(doc)
    doc.set_parser(praser)

    # 提供初始化密码
    # 如果没有密码 就创建一个空的字符串
    doc.initialize()

    # 检测文档是否提供txt转换，不提供就忽略
    if not doc.is_extractable:
        raise PDFTextExtractionNotAllowed
    else:
        # 创建PDf 资源管理器 来管理共享资源
        rsrcmgr = PDFResourceManager()
        # 创建一个PDF设备对象
        laparams = LAParams()
        device = PDFPageAggregator(rsrcmgr, laparams=laparams)
        # 创建一个PDF解释器对象
        interpreter = PDFPageInterpreter(rsrcmgr, device)
        #每页文字内容
        # results = []
        k = 0
        # 循环遍历列表，每次处理一个page的内容
        for page in doc.get_pages():  # doc.get_pages() 获取page列表
            # 打开一个文件用于保存本页文本
            fid = open(txtPath + str(k) + '.txt', 'w', encoding='utf-8')
            interpreter.process_page(page)
            # 接受该页面的LTPage对象
            layout = device.get_result()
            # 这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等 想要获取文本就获得对象的text属性，
            for x in layout:
                if isinstance(x, LTTextBoxHorizontal):
                    # results.append(x.get_text())
                    fid.write(x.get_text() + '\n\n\n')
            fid.close()
            k += 1


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--iPdf', help='pdf path')
    parser.add_argument('--oDir', help='output dir')
    args = parser.parse_args()

    if not os.path.exists(args.oDir):
        os.makedirs(args.oDir)
    pdf_txt(args.iPdf, args.oDir + '/Page-')
